import { Translation, TranslationInfo } from '../types/translation';

/**
 * 分类结果接口
 */
export interface ClassificationResult {
  // 根据不同分类器实现可以具有不同的结构
  [key: string]: any;
  
  // 统计信息
  statistics: {
    totalCount: number;
    [key: string]: any;
  };
}

/**
 * 分类器配置接口
 */
export interface ClassifierConfig {
  // 分类器类型
  type: string;
  
  // 分类规则配置
  rules?: {
    [key: string]: any;
  };
  
  // 自定义选项
  options?: {
    [key: string]: any;
  };
}

/**
 * 分类器接口
 * 为不同平台的分类器提供统一标准
 */
export interface ClassifierInterface {
  /**
   * 分类器类型
   */
  readonly type: string;
  
  /**
   * 对翻译数组进行分类
   * @param translations 翻译数组
   * @returns 分类结果
   */
  classify(translations: Translation[] | TranslationInfo[]): ClassificationResult;
  
  /**
   * 生成分类报告
   * @param result 分类结果
   * @returns 格式化的报告字符串
   */
  generateReport(result: ClassificationResult): string;
  
  /**
   * 将分类结果转换为模块树结构（可选实现）
   * @param translations 翻译数组
   * @returns 模块树结构
   */
  transformToModules?(translations: Translation[] | TranslationInfo[]): any;
  
  /**
   * 生成完整的模块化报告（可选实现）
   * @param translations 翻译数组
   * @returns 报告内容
   */
  generateModuleReport?(translations: Translation[] | TranslationInfo[]): string;
}

/**
 * 模块树转换结果接口
 */
export interface ModuleTransformResult {
  moduleTree: any;
  statistics: {
    [key: string]: any;
  };
}

/**
 * 分类器工厂
 * 用于创建不同类型的分类器
 */
export class ClassifierFactory {
  // 注册的分类器构造函数
  private static classifiers: Map<string, new (config?: ClassifierConfig) => ClassifierInterface> = new Map();
  
  /**
   * 注册分类器
   * @param type 分类器类型
   * @param classifierClass 分类器类
   */
  static register(type: string, classifierClass: new (config?: ClassifierConfig) => ClassifierInterface): void {
    this.classifiers.set(type, classifierClass);
  }
  
  /**
   * 创建分类器
   * @param type 分类器类型
   * @param config 分类器配置
   * @returns 分类器实例
   */
  static create(type: string, config?: ClassifierConfig): ClassifierInterface {
    const ClassifierClass = this.classifiers.get(type);
    
    if (!ClassifierClass) {
      throw new Error(`未知的分类器类型: ${type}`);
    }
    
    return new ClassifierClass(config);
  }
  
  /**
   * 获取已注册的分类器类型
   * @returns 分类器类型数组
   */
  static getRegisteredTypes(): string[] {
    return Array.from(this.classifiers.keys());
  }
} 